iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
自我挑戰組

Codewar 進進出出 JS/Ruby系列 第 5

Sum of Digits / Digital Root

  • 分享至 

  • xImage
  •  

題目:
(6 級) Sum of Digits / Digital Root
給予一個數字 n,算出每個數位的加總。如果總和超過一數位,則繼續加總直到只剩個位數。

範例:

16     -> 1 + 6 = 7
942    -> 9 + 4 + 2 = 15             -> 1 + 5 = 6
132189 -> 1 + 3 + 2 + 1 + 8 + 9 = 24 -> 2 + 4 = 6
493193 -> 4 + 9 + 3 + 1 + 9 + 3 = 29 -> 2 + 9 = 11 -> 1 + 1 = 2

思考方式:

  1. 把拿到的數字轉成字串
  2. 把該字串轉成陣列後再轉回數字做加總
  3. 如果總和超過 10 則繼續加總 (遞迴)

Ruby 解法:

def digital_root(n)
  # 把 `n` 轉成字串
  # 把該字串用 split("") 轉成陣列
  # 用 map 傳入 to_i method 把每個 element 轉回數字
  # 最後加總
  total = n.to_s.split("").map(&:to_i).sum
	
  # 如果總和大於等於 10 重新呼叫一次 digital_root method
  # 並把該次計算的總和當作參數丟進去再跑一次
  # 反之則回傳 total
  total >= 10 ? digital_root(total) : total
end

JavaScript 解法:

function digital_root(n) {
  // 把 `n` 轉成字串
  // 把該字串用 split("") 轉成陣列
  // 直接用 reduce function 把總和算出來
  total = n.toString().split("").reduce((sum, i) => {
	
    // 先把 sum 轉成數字
    sum = Number(sum);
		
    // 回傳兩個數字的加總
    return sum += Number(i);
		
  // 加法的 identity 設為 0
  }, 0);

  // 如果總和大於等於 10 重新呼叫一次 digital_root function
  // 並把該次計算的總和當作參數丟進去再跑一次
  // 反之則回傳 total
  return total >= 10 ? digital_root(total) : total;
}

心得:
雖然有試過 Ruby 直接用 reduce 方法來寫,但寫出來就少了一種 Ruby 的 "優雅感",所以最後決定還是用看起來很厲害的 map(&:to_i).sum


上一篇
Sums of Parts
下一篇
不要結巴!!!
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言